package com.nan.hrm.service.impl;

import com.nan.hrm.domain.CourseFrontType;
import com.nan.hrm.domain.CourseType;
import com.nan.hrm.mapper.CourseTypeMapper;
import com.nan.hrm.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.nan.hrm.util.AjaxResult;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author N
 * @since 2021-09-14
 */
@Service
@Transactional
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @CacheEvict(cacheNames = "course_type",key = "'all'")
    @Override
    public boolean insert(CourseType entity) {
        boolean success = super.insert(entity);
//        if(success){
//            redisTemplate.delete("course_type_all");
//        }
        return success;
    }
    @CacheEvict(cacheNames = "course_type",key = "'all'")
    @Override
    public boolean deleteById(Serializable id) {
        boolean success = super.deleteById(id);
//        if(success){
//            redisTemplate.delete("course_type_all");
//        }
        return success;
    }
    @CacheEvict(cacheNames = "course_type",key = "'all'")
    @Override
    public boolean updateById(CourseType entity) {
        boolean success = super.updateById(entity);
//        if(success){
//            redisTemplate.delete("course_type_all");
//        }
        return success;
    }


    //查询课程分类时，使用redis缓存，提高效率
    @Cacheable(cacheNames = "course_type",key = "'all'")
    @Override
    public AjaxResult treeData() {
//        //先到redis查询，没有就去数据库
//        AjaxResult course_type_all = (AjaxResult) redisTemplate.opsForValue().get("course_type_all");
//        //如果redis中存在，就直接返回
//        if(course_type_all!=null){
//            return course_type_all;
//        }
        // 没有就去数据库查询
        List<CourseType> allCourseTypeList = courseTypeMapper.selectList(null);
        AjaxResult ajaxResult = courseTotreeData(allCourseTypeList);
        // 将数据缓存到redis中
//        redisTemplate.opsForValue().set("course_type_all",ajaxResult);
        return ajaxResult;
    }

    // 前端面包屑展示
    @Override
    public AjaxResult fronttype(Long id) {
        // 查出当前分类的path
        CourseType courseType = courseTypeMapper.selectById(id);
        String path = courseType.getPath();

        String[] paths = path.split("\\.");
//        System.out.println(Arrays.toString(paths));
        List<CourseFrontType> courseFrontTypes = new ArrayList<>();
        // 循环去查
        for (int i = 0; i < paths.length; i++) {
            Long maxId = Long.valueOf(paths[i]);
            // 根据id查询
            CourseFrontType type= courseTypeMapper.fronttype(maxId);
            courseFrontTypes.add(type);
        }
        System.out.println(courseFrontTypes);

        return AjaxResult.me().setResultObj(courseFrontTypes);
    }


    public AjaxResult courseTotreeData(List<CourseType> allCourseTypeList) {
        // 查询出所有的课程类型
        Map<Long, CourseType> map = allCourseTypeList.stream().collect(Collectors.toMap(CourseType::getId, CourseType -> CourseType));


        // 保存一级课程
        List<CourseType> list = new ArrayList<>();

        for (CourseType courseType: allCourseTypeList) {
            // 获取所有的一级课程
            if (courseType.getPid().longValue() == 0 || courseType.getPid() == null){
                list.add(courseType);
            }else{ // 遍历找到自己的上级

                /**
                 * 到这里就不可能有一级的课程。
                 * 如果是二级课程，再遍历一次，可以找到对应的父级课程，然后添加到父级课程中
                 * 如果是三级课程，遍历，同理。
                 */
                CourseType courseType1 = map.get(courseType.getPid());
                courseType1.getChildren().add(courseType);
//                for (CourseType ct :allCourseTypeList) {
//                    if(courseType.getPid().longValue() == ct.getId().longValue()){
//                        ct.getChildren().add(courseType);
//                        break; // 找到了当前课程的父级并添加后就结束当前的这一次循环，进行下一次循环
//                    }
//                }
            }
        }
        return AjaxResult.me().setResultObj(list);
    }
}
